import java.awt.*
import javax.swing.*
import net.miginfocom.swing.*
import griffon.builder.css.CSSDecorator


def binding = { id ->
    bind(id:id, target:model, targetProperty:id)
}
application( locationByPlatform:true, size:[500, 700], title:"ファイル 一括置換ツール", windowClosed:controller.&save, windowOpened:controller.&windowOpened, defaultCloseOperation:WindowConstants.DISPOSE_ON_CLOSE ){
    panel(id:"rootPane"){
        borderLayout()
        menuBar( id:'menuBar', constraints:NORTH) {
            menu( mnemonic:'F', text:'ファイル' ) {
                menuItem( actionPerformed: controller.&save, mnemonic:"S", text:"保存" )
                menuItem( actionPerformed:{ System.exit(0) }, mnemonic:"X", text:"終了" )
            }
        }
        tabbedPane(constraints:CENTER){
            vbox(name:"置換設定"){
                box(border:titledBorder(title:"対象ファイルの検索方法")){
                    vbox{
                        hbox{
                            label( text:"ディレクトリ" )
                            vbox{
                                textField(text:binding("dir"))
                                hbox{
                                    button(actionPerformed:controller.&searchDirectory, text:"参照")
                                    checkBox( label:"サブディレクトリは対象としない", selected:binding("doNotInSubdirectories") )
                                }
                            }
                        }
                        hbox{
                            label( text:"対象ファイル名の一部" )
                            textField(text:binding("includes"))
                        }
                        hbox{
                            label( text:"除外ファイル名の一部" )
                            textField(text:binding("excludes"))
                        }
                        hbox{
                            label( text:"文字コード" )
                            def encodingList = [
                                "",
                                "Shift_JIS",
                                "UTF-8",
                                "UTF-16",
                                "EUC-JP",
                                "ISO-8859-1",
                                "ISO-2022-JP",
                            ]
                            comboBox( items:encodingList, selectedItem:binding("encoding") )
                        }
                    }
                }
                box(border:titledBorder(title:"動作")){
                    vbox{
                        hbox{
                            label( text:"検索文字" )
                            textField(text:binding("token"))
                        }
                        hbox{
                            label( text:"置換文字" )
                            textField(text:binding("replace"))
                        }
                        hbox{
                            label( text:"正規表現" )
                            checkBox( label:"使用する", selected:binding("useRegexp"), actionPerformed:controller.&clickUseRegexp )
                            hglue()
                        }
                        hbox{
                            label( text:"大文字小文字" )
                            checkBox( label:"無視する", selected:binding("ignoreCase") )
                            hglue()
                        }
                    }
                }
                hbox{
                    button( actionPerformed:controller.&replace, text:"実行")
                    button( actionPerformed:controller.&windowOpened, text:"条件を戻す")
                }
                box( border:titledBorder(title:"処理結果") ){
                    scrollPane{
                        textArea( editable:false, text:bind{ model.resultList }, rows:15, background :new Color(0xffffcc))
                    }
                }
            }
            vbox(name:"詳細設定"){
                box(border:titledBorder(title:"対象ファイル")){
                    hglue()
                    hbox{
                        checkBox( label:".(ドット)から始まるファイルを無視", selected:binding("ignoreDotFile") )
                    }
                    hglue()
                }
            }
            vbox(name:"バックアップ"){
                box(border:titledBorder(title:"設定")){
                    hglue()
                    hbox{
                        checkBox( label:"バックアップを行う", selected:binding("doBackup") )
                    }
                    hglue()
                }
                box(border:titledBorder(title:"バックアップ履歴")){
                    hglue()
                    hbox{
                        list( id:"histories", listData:bind{ model.histories }, focusGained:controller.&focusGainedForHistories, focusLost:controller.&focusLostForHistories )
                    }
                    hglue()
                }
                hbox{
                    button( actionPerformed:controller.&restoreHistory, enabled:bind{ model.canRestoreHistory }, text:"選択された時刻のバックアップを取得", id:"restoreHistoryButton" )
                    button( actionPerformed:controller.&clearHistories, text:"すべてクリア", id:"clearHistoriesButton" )
                }
            }
        }
        vbox(constraints:SOUTH){
            textField( border:loweredBevelBorder(), text:bind{ model.message }, editable:false, background:Color.LIGHT_GRAY )
        }
    }
    dialog( modal:true ) {
        fileChooser( fileSelectionMode:JFileChooser.DIRECTORIES_ONLY, id:"fileChooser" )
    }
}

CSSDecorator.applyStyle("""
jlabel{
    pref-width: 140px;
    font-family: monospace;
    font-weight: bold;
}
""", view.rootPane)
